Make gtk_widget_get_state_flags() avoid propagating the focused flag down the hierarchy
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 21 Jan 2011 14:19:44 +0000 (15:19 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 21 Jan 2011 14:25:29 +0000 (15:25 +0100)
There is only one widget supposed to have the focused flag at a given time,
so avoid propagating the state down the hierarchy, the focused flag is now
also set in _gtk_widget_set_has_focus().

gtk/gtkwidget.c

index a152b3f4b8e02c04a7dbc7f84fe6d56c824bb74c..c1950894a92a2252bd503a87a171f983d0886a80 100644 (file)
@@ -6971,6 +6971,14 @@ _gtk_widget_update_state_flags (GtkWidget     *widget,
 
   flags &= ~(GTK_STATE_FLAG_INSENSITIVE);
 
+  /* Focused state is meant to be set only on the widget
+   * being changed itself, not on the children */
+  if ((flags & GTK_STATE_FLAG_FOCUSED) !=
+      (priv->state_flags & GTK_STATE_FLAG_FOCUSED))
+    priv->state_flags |= GTK_STATE_FLAG_FOCUSED;
+
+  flags &= ~(GTK_STATE_FLAG_FOCUSED);
+
   if (flags != 0 ||
       operation == STATE_CHANGE_REPLACE)
     {
@@ -7075,6 +7083,9 @@ gtk_widget_get_state_flags (GtkWidget *widget)
   if (!gtk_widget_is_sensitive (widget))
     flags |= GTK_STATE_FLAG_INSENSITIVE;
 
+  if (gtk_widget_has_focus (widget))
+    flags |= GTK_STATE_FLAG_FOCUSED;
+
   return flags;
 }
 
@@ -13906,6 +13917,11 @@ _gtk_widget_set_has_focus (GtkWidget *widget,
                            gboolean   has_focus)
 {
   widget->priv->has_focus = has_focus;
+
+  if (has_focus)
+    gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_FOCUSED, FALSE);
+  else
+    gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_FOCUSED);
 }
 
 /**